package com.zx._01_基础._010_util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import org.junit.Test;

/**
 * @version v1.0
 * @Project: knowledge-jdk
 * @Title: BigDecimalTest
 * @Description: 常见用法
 *         https://blog.csdn.net/weixin_37730482/article/details/73468042
 * @author: zhangxue01
 * @date: 2020-10-22 11:50:40
 * @company: zhangxue
 * @Copyright: Copyright (c) 2015
 */
public class BigDecimalTest {

    // BigDecimal加减乘除运算
    @Test
    public void test1() {
        BigDecimal num = new BigDecimal(10);
        System.out.println(num);

        // 加法
        BigDecimal add = num.add(new BigDecimal(5));
        System.out.println(add);

        // 减法
        BigDecimal subtract = num.subtract(new BigDecimal(5));
        System.out.println(subtract);

        // 乘法
        BigDecimal multiply = num.multiply(new BigDecimal(2));
        System.out.println(multiply);

        // 除法
        BigDecimal divide = num.divide(new BigDecimal(2));
        System.out.println(divide);
    }

    // BigDecimal 对小数的四舍五入
    @Test
    public void test2() {
        // 格式化处理，DecimalFormat
        DecimalFormat df = new DecimalFormat("#.00");
        String format = df.format(4D);
        System.out.println(format);

        // 保留四位小数，默认用四舍五入方式
        BigDecimal scale = new BigDecimal(10).setScale(4);
        System.out.println(scale);

        // 四舍五入，遇到5向上取值(使用的多)
        scale = new BigDecimal(1.15).setScale(1, RoundingMode.HALF_UP);
        System.out.println("HALF_UP=" + scale);

        // 四舍五入，遇到小于等于5的向下取值
        scale = new BigDecimal(1.15).setScale(1, RoundingMode.HALF_DOWN);
        System.out.println("HALF_DOWN=" + scale);

        // 向下取值
        scale = new BigDecimal(1.12).setScale(1, RoundingMode.DOWN);
        System.out.println("DOWN=" + scale);

        // 向上取值
        scale = new BigDecimal(1.12).setScale(1, RoundingMode.UP);
        System.out.println("UP=" + scale);
    }

    // 数字精度
    @Test
    public void test3() {
        BigDecimal testData = new BigDecimal("3000000.000");
        System.out.println("直接转换成字符串后输出：" + testData.toString());
        System.out.println("去掉尾部无用的零并转换成字符串后输出：" + testData.stripTrailingZeros().toString());
        System.out.println("只展示数值：" + testData.stripTrailingZeros().toPlainString());
        System.out.println("工程计数法输出：" + testData.stripTrailingZeros().toEngineeringString());
    }

    // 数字对比
    @Test
    public void test4() {
        BigDecimal bigDecimal = new BigDecimal(1);
        BigDecimal bigDecimal1 = new BigDecimal(1);
        System.out.println(bigDecimal.equals(bigDecimal1));

        BigDecimal bigDecimal2 = new BigDecimal(1);
        BigDecimal bigDecimal3 = new BigDecimal(1.0);
        System.out.println(bigDecimal2.equals(bigDecimal3));

        BigDecimal bigDecimal4 = new BigDecimal("1");
        BigDecimal bigDecimal5 = new BigDecimal("1.0");
        // equals 会对比小数点
        System.out.println(bigDecimal4.equals(bigDecimal5));
        //应该使用 compareTo对比，是对数据值进行数字比较
        System.out.println(bigDecimal4.compareTo(bigDecimal5));
    }


}
